home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / demo / mag / Infamia3.lha / infamia03 / mv_code / copper / skip3.s < prev    next >
Text File  |  1996-07-24  |  7KB  |  256 lines

  1.         ************************************
  2.         *       /\/\                       *
  3.         *      /    \                      *
  4.         *     / /\/\ \ O R B_I D           *
  5.         *    / /    \ \   / /              *
  6.         *   / /    __\ \ / /               *
  7.         *   ¯¯     \ \¯¯/ / I S I O N S    *
  8.         *           \ \/ /                 *
  9.         *            \  /                  *
  10.         *             \/                   *
  11.         *     Feel the DEATH inside!       *
  12.         ************************************
  13.         * Coded by:                        *
  14.         * The Dark Coder / Morbid Visions  *
  15.         ************************************
  16.  
  17. ; commenti alla fine del sorgente
  18.  
  19.     SECTION    DK,code
  20.  
  21.     incdir    "Infamia:MV_code/"
  22.     include    MVstartup.s        ; Codice di startup: prende il
  23.                     ; controllo del sistema e chiama
  24.                     ; la routine START: ponendo
  25.                     ; A5=$DFF000
  26.  
  27.         ;5432109876543210
  28. DMASET    EQU    %1000001010000000    ; copper,bitplane,blitter DMA
  29.  
  30.  
  31. START:
  32.  
  33.     move    #DMASET,dmacon(a5)
  34.     move.l    #COPPERLIST,cop1lc(a5)
  35.     move    d0,copjmp1(a5)
  36.  
  37.     move.l    #copperloop,cop2lc(a5)    ; carica l'indirizzo del loop
  38.                     ; in COP2LC
  39.  
  40. mouse:
  41.  
  42.     bsr    CambiaCopper
  43.  
  44.     moveq    #3-1,d7
  45. WaitFrame
  46. ; notare il doppio controllo sulla sincronia
  47. ; necessario perche` la muovicopper richiede MENO di UNA rasterline su 68030
  48.     move.l    #$1ff00,d1    ; bit per la selezione tramite AND
  49.     move.l    #$13000,d2    ; linea da aspettare = $130, ossia 304
  50. .Waity1
  51.     move.l    vposr(a5),d0    ; vposr e vhposr
  52.     and.l    d1,d0        ; seleziona solo i bit della pos. verticale
  53.     cmp.l    d2,d0        ; aspetta la linea $130 (304)
  54.     bne.s    .waity1
  55.  
  56. .Waity2
  57.     move.l    vposr(a5),d0
  58.     and.l    d1,d0
  59.     cmp.l    d2,d0
  60.     beq.s    .waity2
  61.  
  62.     dbra    d7,WaitFrame
  63.  
  64.     btst    #6,$bfe001        ; tasto sinistro del mouse premuto?
  65.     bne.s    mouse            ; se no, torna a mouse:
  66.  
  67.     rts
  68.  
  69. ****************************************************
  70. * Questa routine muove la bandiera e cambia i colori
  71.  
  72. CambiaCopper:
  73.  
  74.     move.b    PosBandiera(pc),d0
  75.  
  76.     tst.b    PosFlag
  77.     beq.s    Basso
  78.  
  79.     subq.b    #1,d0
  80.     cmp.b    #$81,d0
  81.     bra.s    Muovi        ; le istruzioni Bcc non alterano i CC
  82.  
  83. Basso    addq.b    #1,d0
  84.     cmp.b    #$bf,d0
  85.  
  86. Muovi
  87.     shs    PosFlag        ; testa limiti (entrambi! ;)
  88.     move.b    d0,PosBandiera
  89.     lsl    #8,d0
  90.     move.b    #$07,d0
  91.     move    d0,Inizio
  92.     add    #$4000,d0
  93.     move    d0,Fine
  94.  
  95.     tst.b    FadeFlag
  96.     beq.s    FadeIn
  97.  
  98. FadeOut
  99.     sub    #$010,verde+2    ; aumenta luminosita`
  100.     cmp    #$080,verde+2
  101.     sne    FadeFlag    ; se siamo al minimo passa a FadeIn
  102.  
  103.     sub    #$111,bianco+2    ; aumenta luminosita`
  104.     sub    #$100,rosso+2    ; aumenta luminosita`
  105.     rts
  106.  
  107. FadeIn
  108.     add    #$010,verde+2    ; aumenta luminosita`
  109.     cmp    #$0f0,verde+2    ; se siamo al massimo passa a FadeOut
  110.     seq    FadeFlag
  111.  
  112.     add    #$111,bianco+2    ; aumenta luminosita`
  113.     add    #$100,rosso+2    ; aumenta luminosita`
  114.  
  115.     rts
  116.  
  117. * Posizione prima riga della bandiera
  118. ; La bandiera deve rimanere tra le righe $80 e $ff, quindi essendo alta
  119. ; $40, la posizione deve variare tra le righe $80 e $bf
  120. PosBandiera    dc.b    $a0
  121. PosFlag        dc.b    0
  122. FadeFlag    dc.b    0
  123.  
  124.     SECTION    MY_COPPER,CODE_C
  125.  
  126. *************************************************************************
  127. * Copper Macros by The Dark Coder / Morbid Visions
  128. * vers. 3 SE / 16-07-96 / per ASM One 1.29
  129. * questa e` una versione ridotta delle copper macros usate dai Morbid Visions
  130. * realizzata appositamente per i sorgenti pubblicati su Infamia.
  131. * La versione completa (integrata con le altre macros standard MV) ha
  132. * controlli aggiuntivi sugli errori e permette di utilizzare il Blitter
  133. * Finished Disable bit. Chi e` interessato puo` contattare The Dark Coder.
  134.  
  135. * formato
  136. * CMOVE valore immediato, registro hardware destinazione
  137. * WAIT  Hpos,Vpos[,Hena,Vena]
  138. * SKIP  Hpos,Vpos[,Hena,Vena]
  139. * CSTOP
  140.  
  141. * Nota: Hpos,Vpos coordinate copper, Hena, Vena sono i valori di maschera
  142. * della posizione copper, opzionali (se non specificati viene assunto
  143. * Hena=$fe e Vena=$7f)
  144.  
  145. cmove:    macro
  146.     dc.w     [\2&$1fe]
  147.     dc.w    \1
  148.     endm
  149.  
  150. wait:    macro
  151.     dc.w    [\2<<8]+[\1&$fe]+1
  152.     ifeq    narg-2
  153.         dc.w    $fffe
  154.     endc    
  155.     ifeq    narg-4
  156.         dc.w    $8000+[[\4&$7f]<<8]+[\3&$fe]
  157.     endc
  158.     endm
  159.  
  160. skip:    macro
  161.     dc.w    [\2<<8]+[\1&$fe]+1
  162.     ifeq    narg-2
  163.         dc.w    $fffe
  164.     endc    
  165.     ifeq    narg-4
  166.         dc.w    $8000+[[\4&$7f]<<8]+[\3&$fe]+1
  167.     endc
  168.     endm
  169.  
  170.  
  171. cstop:    macro
  172.     dc.w    $ffff
  173.     dc.w    $fffe
  174.     endm
  175.  
  176.  
  177. * inizia la copperlist
  178. COPPERLIST:
  179.  
  180. ; barra 1
  181.     cmove    $111,color00
  182.     wait    $7,$29
  183.     cmove    $a0a,color00
  184.     wait    $7,$2a
  185.     cmove    $11f,color00
  186.     wait    $7,$2b
  187.     cmove    $000,color00
  188.  
  189. Inizio:
  190.     wait    $7,$80
  191.  
  192. copperloop:            ; da qui inizia il loop
  193.  
  194. verde:    cmove    $080,color00    ; colore verde. Il valore RGB da caricare nel
  195.                 ; registro si trova all'indirizzo "verde+2"
  196.                 ; perche` e` la seconda word dell'istruzione
  197.                 ; copper
  198.  
  199.     wait    $6b,$80,$fe,0    ; aspetta primo terzo di schermo
  200.                 ; (le y sono mascherate)
  201.  
  202. bianco:    cmove    $888,color00    ; bianco. Modificare a "bianco+2"
  203.     wait    $a5,$80,$fe,0    ; aspetta secondo terzo di schermo
  204.  
  205. rosso:    cmove    $800,color00    ; rosso. Modificare a "rosso+2"
  206.     wait    $e0,$80,$fe,0    ; aspetta la fine della riga
  207.  
  208. Fine:
  209.     skip    0,$c0,0,$7f    ; SKIP alla linea $c0
  210.                 ; (le x sono mascherate)
  211.  
  212.     cmove    0,copjmp2    ; scrive in COPJMP2 - salta ad inizio loop
  213.  
  214.     cmove    $000,color00
  215.     wait    220,255
  216.  
  217. ; barra 2
  218.     wait    $7,$14
  219.     cmove    $11f,color00
  220.     wait    $7,$15
  221.     cmove    $a0a,color00
  222.     wait    $7,$16
  223.     cmove    $111,color00
  224.  
  225.     cstop            ; Fine della copperlist
  226.  
  227.     end
  228.  
  229. Questo esempio mostra una notevole ottimizzazione ottenuta mediante l'uso
  230. dei copperloop.
  231. Abbiamo una bandiera che cambia colore e che si sposta in alto e in basso.
  232. Per disegnare la bandiera si deve cambiare COLOR00 3 volte all'interno di una
  233. riga di raster e ripetere gli stessi colori ad ogni riga. E` molto comodo usare
  234. un copperloop. Le wait all'interno del loop hanno le posizioni verticali
  235. mascherate, in modo da funzionare ad ogni riga di raster senza essere
  236. modificate.
  237. Per cambiare i colori, e` necessario modificare 3 sole istruzioni copper.
  238. Inoltre per spostare verticalmente la bandiera basta modificare ogni volta la
  239. posizione di attesa della WAIT che precede il loop e della SKIP che termina il
  240. loop. In totale quindi abbiamo 5 sole modifiche da effettuare in memoria.
  241.  
  242. Se non usasassimo ne` il copperloop ne` le WAIT mascherate dovremmo modificare
  243. ad ogni riga di raster, le 3 CMOVE (copper move) e le 3 WAIT per attendere le
  244. varie posizioni. Poiche` la bandiera e` alta 64 righe, avremmo in totale
  245. 64*6=384 locazioni di memoria da modificare.
  246.  
  247. Come potete inoltre notare, e come anticipato nell'articolo su Infamia,
  248. in questo sorgente vengono definite e utilizzate delle macro per definire le
  249. istruzioni copper. In questo modo si ottengono (a mio avviso) dei sorgenti
  250. piu` puliti e si riduce la probabilita` di commettere errori nella scrittura
  251. delle copper list. Ad esempio confrontate la parte di copperlist che genera
  252. la barretta colorata in alto in questo sorgente, con l'identico pezzo generato
  253. con le DC.W negli esempi skip1.s e skip2.s. La versione in questo sorgente e`
  254. immediatamente comprensibile anche ad una rapida occhiata ed e` molto piu`
  255. elegante ed ordinata.
  256.